/*
 * @Author       : xh
 * @Date         : 2022-08-24 14:34:52
 * @LastEditors: loserjohn
 * @FileName     :
 */
import router from '@/router';
import { getToken } from '@/utils/auth'; // get token from cookie
import NProgress from 'nprogress'; // progress bar
import 'nprogress/nprogress.css'; // progress bar style
import { storeToRefs } from 'pinia';
import { usePermissionStore, useUserStore } from './store';
let flag = 0
NProgress.configure({ showSpinner: false }) // NProgress Configuration
// 获取pinia的方法及数据
const whiteList = ['/register', '/login'] // no redirect whitelist
let hasAuthority = true
router.beforeEach(async (to, from, next) => {
  const storeUserInfo = useUserStore() // 用户信息获取
  const storeRouterInfo = usePermissionStore() // 动态路由设置
  // 如果要解构使用状态需要使用该api进行转换，否则不具有响应式

  NProgress.start()
  // document.title = '名字暂没有动态配置'
  const hasToken = getToken()[0]
  // 判断是否在页面白名单中，如果在的话，直接进入页面，不校验token和路由
  if (whiteList.indexOf(to.path) !== -1) {
    // debugger
    next()
  } else {
    if (hasToken) {
      const { userInfo } = storeToRefs(storeUserInfo)

      const hasRoles = userInfo.userId ? true : false

      // debugger
      if (hasRoles) {
        // 有token 且已经加载路由的情况下，直接进入页面
        next()
      } else {
        // 未加载路由的情况下
        if (to.path === '/login' && !hasAuthority) {
          // 如果是去登陆页，并且已经获取用户信息失败过一次，则直接跳转到登陆页(这里的目的是为了防止重复请求接口)
          next()
        } else {
          // console.log('我在重新获取登录信息哦！！！！！！！！')
          try {
            // 否则尝试获取用户信息
            if (!storeRouterInfo.addRoutes.length) {
              await storeUserInfo.getUserInfo('user/getInfo')
              const accessRoutes = await storeRouterInfo.createRouters('permission/generateRoutes')
              console.log('accessRoutes', accessRoutes)
              // 必须循环添加到路由中，否则会导致无限重定向
              accessRoutes.forEach((value) => {
                router.addRoute(value)
                // next()
                // return value.path
              })
            }

            // router.addRoute(accessRoutes)
            // debugger
            // console.log('getRoutes', router.getRoutes())
            hasAuthority = true
            // console.log('进入前', from, to, flag, storeRouterInfo.addRoutes.length)
            if (to.path === '/login') {
              // 获取用户信息成功之后，如果将要去的页面是登陆页，则重定向至redirect的参数页面或者首页
              next({ path: to.query.redirect || '/', replace: true })
            }
            if (flag === 0) {
              next({ ...to, replace: true })
              flag++
            } else {
              // 如果不是登陆页，则直接跳转
              // console.log('是否进入', to)
              // debugger
              next()

              // next({...to, replace: true})
              // next({ path: to.path, replace: true })
            }
            // debugger
          } catch (error) {
            console.log('error', error)
            // debugger
            hasAuthority = false
            if (to.path === '/login') {
              // 获取用户信息失败，如果去的页面是登陆页则直接跳转
              next()
            } else {
              // 否则带上redirect参数，跳转到登陆页
              next(`/login?redirect=${to.path}`)
              NProgress.done()
            }
          }
        }
      }
    } else {
      // 如果没token的话
      if (to.path === '/login') {
        // 如果去的页面是登陆页则直接跳转
        next()
      } else {
        // 否则带上redirect参数，跳转到登陆页
        next(`/login?redirect=${to.path}`)
        NProgress.done()
      }
    }
  }
})

router.afterEach(() => {
  // finish progress bar
  NProgress.done()
})
